<?php

/**
 * This class gives complete information about 'Web Safe Colors'
 *
 * It can  checks if a color if web safe or not.
 * It can also return any of RGB, Hexadecimal or name of the web safe color....
 * ... by entring any one of above mentioned three parameters.   Pretty neat eh ?  :)
 *
 *
 *
 * @author  Rochak Chauhan
 * 
 */

class WebSafeColors {
	// initialize the database of 140 web safe colors
	private $isExactMatch = -1;
	private $webSafeColorDatabase = Array(  
											0=>Array('colorName'=>'aliceblue', 'hexValue'=>'#F0F8FF'),
											1=>Array('colorName'=>'darkslategray', 'hexValue'=>'#2F4F4F'),
											2=>Array('colorName'=>'lightsalmon', 'hexValue'=>'#FFA07A'),
											3=>Array('colorName'=>'palevioletred', 'hexValue'=>'#DB7093'),
											4=>Array('colorName'=>'antiquewhite', 'hexValue'=>'#FAEBD7'),
											5=>Array('colorName'=>'darkturquoise', 'hexValue'=>'#00CED1'),
											6=>Array('colorName'=>'lightseagreen', 'hexValue'=>'#20B2AA'),
											7=>Array('colorName'=>'papayawhip', 'hexValue'=>'#FFEFD5'),
											8=>Array('colorName'=>'aqua', 'hexValue'=>'#00FFFF'),
											9=>Array('colorName'=>'darkviolet', 'hexValue'=>'#9400D3'),
											10=>Array('colorName'=>'lightskyblue', 'hexValue'=>'#87CEFA'),
											11=>Array('colorName'=>'peachpuff', 'hexValue'=>'#FFDAB9'),
											12=>Array('colorName'=>'aquamarine', 'hexValue'=>'#7FFFD4'),
											13=>Array('colorName'=>'deeppink', 'hexValue'=>'#FF1493'),
											14=>Array('colorName'=>'lightslategray', 'hexValue'=>'#778899'),
											15=>Array('colorName'=>'peru', 'hexValue'=>'#CD853F'),
											16=>Array('colorName'=>'azure', 'hexValue'=>'#F0FFFF'),
											17=>Array('colorName'=>'deepskyblue', 'hexValue'=>'#00BFFF'),
											18=>Array('colorName'=>'lightsteelblue', 'hexValue'=>'#B0C4DE'),
											19=>Array('colorName'=>'pink', 'hexValue'=>'#FFC0CB'),
											20=>Array('colorName'=>'beige', 'hexValue'=>'#F5F5DC'),
											21=>Array('colorName'=>'dimgray', 'hexValue'=>'#696969'),
											22=>Array('colorName'=>'lightyellow', 'hexValue'=>'#FFFFE0'),
											23=>Array('colorName'=>'plum', 'hexValue'=>'#DDA0DD'),
											24=>Array('colorName'=>'bisque', 'hexValue'=>'#FFE4C4'),
											25=>Array('colorName'=>'dodgerblue', 'hexValue'=>'#1E90FF'),
											26=>Array('colorName'=>'lime', 'hexValue'=>'#00FF00'),
											27=>Array('colorName'=>'powderblue', 'hexValue'=>'#B0E0E6'),
											28=>Array('colorName'=>'black', 'hexValue'=>'#000000'),
											29=>Array('colorName'=>'firebrick', 'hexValue'=>'#B22222'),
											30=>Array('colorName'=>'limegreen', 'hexValue'=>'#32CD32'),
											31=>Array('colorName'=>'purple', 'hexValue'=>'#800080'),
											32=>Array('colorName'=>'blanchedalmond', 'hexValue'=>'#FFEBCD'),
											33=>Array('colorName'=>'floralwhite', 'hexValue'=>'#FFFAF0'),
											34=>Array('colorName'=>'linen', 'hexValue'=>'#FAF0E6'),
											35=>Array('colorName'=>'red', 'hexValue'=>'#FF0000'),
											36=>Array('colorName'=>'blue', 'hexValue'=>'#0000FF'),
											37=>Array('colorName'=>'forestgreen', 'hexValue'=>'#228B22'),
											38=>Array('colorName'=>'magenta', 'hexValue'=>'#FF00FF'),
											39=>Array('colorName'=>'rosybrown', 'hexValue'=>'#BC8F8F'),
											40=>Array('colorName'=>'blueviolet', 'hexValue'=>'#8A2BE2'),
											41=>Array('colorName'=>'fuchsia', 'hexValue'=>'#FF00FF'),
											42=>Array('colorName'=>'maroon', 'hexValue'=>'#800000'),
											43=>Array('colorName'=>'royalblue', 'hexValue'=>'#4169E1'),
											44=>Array('colorName'=>'brown', 'hexValue'=>'#A52A2A'),
											45=>Array('colorName'=>'gainsboro', 'hexValue'=>'#DCDCDC'),
											46=>Array('colorName'=>'mediumaquamarine', 'hexValue'=>'#66CDAA'),
											47=>Array('colorName'=>'saddlebrown', 'hexValue'=>'#8B4513'),
											48=>Array('colorName'=>'burlywood', 'hexValue'=>'#DEB887'),
											49=>Array('colorName'=>'ghostwhite', 'hexValue'=>'#F8F8FF'),
											50=>Array('colorName'=>'mediumblue', 'hexValue'=>'#0000CD'),
											51=>Array('colorName'=>'salmon', 'hexValue'=>'#FA8072'),
											52=>Array('colorName'=>'cadetblue', 'hexValue'=>'#5F9EA0'),
											53=>Array('colorName'=>'gold', 'hexValue'=>'#FFD700'),
											54=>Array('colorName'=>'mediumorchid', 'hexValue'=>'#BA55D3'),
											55=>Array('colorName'=>'sandybrown', 'hexValue'=>'#F4A460'),
											56=>Array('colorName'=>'chartreuse', 'hexValue'=>'#7FFF00'),
											57=>Array('colorName'=>'goldenrod', 'hexValue'=>'#DAA520'),
											58=>Array('colorName'=>'mediumpurple', 'hexValue'=>'#9370DB'),
											59=>Array('colorName'=>'seagreen', 'hexValue'=>'#2E8B57'),
											60=>Array('colorName'=>'chocolate', 'hexValue'=>'#D2691E'),
											61=>Array('colorName'=>'gray', 'hexValue'=>'#808080'),
											62=>Array('colorName'=>'mediumseagreen', 'hexValue'=>'#3CB371'),
											63=>Array('colorName'=>'seashell', 'hexValue'=>'#FFF5EE'),
											64=>Array('colorName'=>'coral', 'hexValue'=>'#FF7F50'),
											65=>Array('colorName'=>'green', 'hexValue'=>'#008000'),
											66=>Array('colorName'=>'mediumslateblue', 'hexValue'=>'#7B68EE'),
											67=>Array('colorName'=>'sienna', 'hexValue'=>'#A0522D'),
											68=>Array('colorName'=>'cornflowerblue', 'hexValue'=>'#6495ED'),
											69=>Array('colorName'=>'greenyellow', 'hexValue'=>'#ADFF2F'),
											70=>Array('colorName'=>'mediumspringgreen', 'hexValue'=>'#00FA9A'),
											71=>Array('colorName'=>'silver', 'hexValue'=>'#C0C0C0'),
											72=>Array('colorName'=>'cornsilk', 'hexValue'=>'#FFF8DC'),
											73=>Array('colorName'=>'honeydew', 'hexValue'=>'#F0FFF0'),
											74=>Array('colorName'=>'mediumturquoise', 'hexValue'=>'#48D1CC'),
											75=>Array('colorName'=>'skyblue', 'hexValue'=>'#87CEEB'),
											76=>Array('colorName'=>'crimson', 'hexValue'=>'#DC143C'),
											77=>Array('colorName'=>'hotpink', 'hexValue'=>'#FF69B4'),
											78=>Array('colorName'=>'mediumvioletred', 'hexValue'=>'#C71585'),
											79=>Array('colorName'=>'slateblue', 'hexValue'=>'#6A5ACD'),
											80=>Array('colorName'=>'cyan', 'hexValue'=>'#00FFFF'),
											81=>Array('colorName'=>'indianred', 'hexValue'=>'#CD5C5C'),
											82=>Array('colorName'=>'midnightblue', 'hexValue'=>'#191970'),
											83=>Array('colorName'=>'slategray', 'hexValue'=>'#708090'),
											84=>Array('colorName'=>'darkblue', 'hexValue'=>'#00008B'),
											85=>Array('colorName'=>'indigo', 'hexValue'=>'#4B0082'),
											86=>Array('colorName'=>'mintcream', 'hexValue'=>'#F5FFFA'),
											87=>Array('colorName'=>'snow', 'hexValue'=>'#FFFAFA'),
											88=>Array('colorName'=>'darkcyan', 'hexValue'=>'#008B8B'),
											89=>Array('colorName'=>'ivory', 'hexValue'=>'#FFFFF0'),
											90=>Array('colorName'=>'mistyrose', 'hexValue'=>'#FFE4E1'),
											91=>Array('colorName'=>'springgreen', 'hexValue'=>'#00FF7F'),
											92=>Array('colorName'=>'darkgoldenrod', 'hexValue'=>'#B8860B'),
											93=>Array('colorName'=>'khaki', 'hexValue'=>'#F0E68C'),
											94=>Array('colorName'=>'moccasin', 'hexValue'=>'#FFE4B5'),
											95=>Array('colorName'=>'steelblue', 'hexValue'=>'#4682B4'),
											96=>Array('colorName'=>'darkgray', 'hexValue'=>'#A9A9A9'),
											97=>Array('colorName'=>'lavender', 'hexValue'=>'#E6E6FA'),
											98=>Array('colorName'=>'navajowhite', 'hexValue'=>'#FFDEAD'),
											99=>Array('colorName'=>'tan', 'hexValue'=>'#D2B48C'),
											100=>Array('colorName'=>'darkgreen', 'hexValue'=>'#006400'),
											101=>Array('colorName'=>'lavenderblush', 'hexValue'=>'#FFF0F5'),
											102=>Array('colorName'=>'navy', 'hexValue'=>'#000080'),
											103=>Array('colorName'=>'teal', 'hexValue'=>'#008080'),
											104=>Array('colorName'=>'darkkhaki', 'hexValue'=>'#BDB76B'),
											105=>Array('colorName'=>'lawngreen', 'hexValue'=>'#7CFC00'),
											106=>Array('colorName'=>'oldlace', 'hexValue'=>'#FDF5E6'),
											107=>Array('colorName'=>'thistle', 'hexValue'=>'#D8BFD8'),
											108=>Array('colorName'=>'darkmagenta', 'hexValue'=>'#8B008B'),
											109=>Array('colorName'=>'lemonchiffon', 'hexValue'=>'#FFFACD'),
											110=>Array('colorName'=>'olive', 'hexValue'=>'#808000'),
											111=>Array('colorName'=>'tomato', 'hexValue'=>'#FD6347'),
											112=>Array('colorName'=>'darkolivegreen', 'hexValue'=>'#556B2F'),
											113=>Array('colorName'=>'lightblue', 'hexValue'=>'#ADD8E6'),
											114=>Array('colorName'=>'olivedrab', 'hexValue'=>'#6B8E23'),
											115=>Array('colorName'=>'turquoise', 'hexValue'=>'#40E0D0'),
											116=>Array('colorName'=>'darkorange', 'hexValue'=>'#FF8C00'),
											117=>Array('colorName'=>'lightcoral', 'hexValue'=>'#F08080'),
											118=>Array('colorName'=>'orange', 'hexValue'=>'#FFA500'),
											119=>Array('colorName'=>'violet', 'hexValue'=>'#EE82EE'),
											120=>Array('colorName'=>'darkorchid', 'hexValue'=>'#9932CC'),
											121=>Array('colorName'=>'lightcyan', 'hexValue'=>'#E0FFFF'),
											122=>Array('colorName'=>'orangered', 'hexValue'=>'#FF4500'),
											123=>Array('colorName'=>'wheat', 'hexValue'=>'#F5DEB3'),
											124=>Array('colorName'=>'darkred', 'hexValue'=>'#8B0000'),
											125=>Array('colorName'=>'lightgoldenrodyellow', 'hexValue'=>'#FAFAD2'),
											126=>Array('colorName'=>'orchid', 'hexValue'=>'#DA70D6'),
											127=>Array('colorName'=>'white', 'hexValue'=>'#FFFFFF'),
											128=>Array('colorName'=>'darksalmon', 'hexValue'=>'#E9967A'),
											129=>Array('colorName'=>'lightgreen', 'hexValue'=>'#90EE90'),
											130=>Array('colorName'=>'palegoldenrod', 'hexValue'=>'#EEE8AA'),
											131=>Array('colorName'=>'whitesmoke', 'hexValue'=>'#F5F5F5'),
											132=>Array('colorName'=>'darkseagreen', 'hexValue'=>'#8FBC8F'),
											133=>Array('colorName'=>'lightgrey', 'hexValue'=>'#D3D3D3'),
											134=>Array('colorName'=>'palegreen', 'hexValue'=>'#98FB98'),
											135=>Array('colorName'=>'yellow', 'hexValue'=>'#FFFF00'),
											136=>Array('colorName'=>'darkslateblue', 'hexValue'=>'#483D8B'),
											137=>Array('colorName'=>'lightpink', 'hexValue'=>'#FFB6C1'),
											138=>Array('colorName'=>'paleturquoise', 'hexValue'=>'#AFEEEE'),
											139=>Array('colorName'=>'yellowgreen', 'hexValue'=>'#9ACD32'),
								   		  );
	/**
	 * Function to get RGB value form its hex code
	 *
	 *
	 * @param $hexValue  string  - format #ff0067
	 * @return string - rgb value
	 */
	public function getRgbValuefromHex($hexValue) {
		if($hexValue[0] == '#' && strlen(trim($hexValue))==7) {
			$r = $hexValue[1].$hexValue[2];
			$g = $hexValue[3].$hexValue[4];
			$b = $hexValue[5].$hexValue[6];
			
			return hexdec($r).",".hexdec($g).",".hexdec($b);
		}
		else {
			echo "<b><font face='verdana' color='red' size='2'> ERROR: Invalid color Information. </font></b>";
			return false;
		}
	}
		
	/**
	 * Function to display the complete information of web safe colors
	 *
	 * @return array
	 */
	public function displayColorDatabase() {
		echo "<table width='80%' align='center' cellpadding='2' cellspacing='0' border=0' ><tr  style='background-color:blanchedalmond'> ";
		echo "<td><b><font face='verdana' color='brown' size='2'> S No. </font></b></td> 
			  <td><b><font face='verdana' color='black' size='2'> 'Color Name' </font></b></td> 
			  <td><b><font face='verdana' color='green' size='2'> 'Hex Value' </font></b></td> 
			  <td><b><font face='verdana' color='red' size='2'> 'RGB Value' </font></b></td>
			  <td><b><font face='verdana' color='blue' size='2'> 'COLOR' </font></b></td></tr> <tr><td colspan='5'><BR></td></tr>";
		
		
		for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
			if($i%2 == 0) {
				$bgColor ='lavender';
			}
			else {
				$bgColor ='#FFFFFF';
			}
			
			echo "<tr style='background-color:$bgColor'>
				<td><b><font face='verdana' color='brown' size='2'>". ($i+1) ."</font></b></td> 
				<td><b><font face='verdana' color='black' size='2'>". $this->webSafeColorDatabase[$i]['colorName'] ."</font></b></td> 
				<td><b><font face='verdana' color='green' size='2'>". $this->webSafeColorDatabase[$i]['hexValue'] ."</font></b></td> 
				<td><b><font face='verdana' color='red' size='2'>". $this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue']) ."</font></b></td>
				<td align='center' style='background-color:".$this->webSafeColorDatabase[$i]['colorName']."'></td> </tr>";

		}
		echo "</tr></table>";
	}
	
	
	/**
	 * Function to return the name of the web safe color
	 *
	 * @param $colorInfo string - could be the value of color in hexadecimal or in rgb
	 *							  usage getColorName('#FF0033')  
	 *	 									OR
	 *							  usage getColorName('255,23,56')  
	 * @return string - name of the web safe color (if present in the above $webSafeColorDatabase) , false otherwise
	 */
	public function getColorName($colorInfo) {
		// input check
		if( trim($colorInfo[0]) != '#' && substr_count($colorInfo, ",") != 2 ) {
			echo "<b><font face='verdana' color='red' size='2'> ERROR: Invalid color Information. </font></b>";
			return false;
		}
		else{
			if(trim($colorInfo[0]) == '#' && strlen(trim($colorInfo)) == 7) {
				// the input color is in hexadecimal
				for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
					if( strtolower(trim($this->webSafeColorDatabase[$i]['hexValue']))== strtolower(trim($colorInfo)) ) {
						return $this->webSafeColorDatabase[$i]['colorName'];								
					}
				}	
			}
			else {
				// the input color is in RGB
				for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
					if( strtolower(trim($this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue']))) == trim($colorInfo) ) {
						return $this->webSafeColorDatabase[$i]['colorName'];								
					}
				}
			}			
		}
		return false;
	}
	
	
	/**
	 * Function to return the hexadecimal value of the web safe color
	 *
	 * @param $colorInfo string - could be the value of color in rgb or name of the color (no spaces between the name)
	 *							  usage getHexValue('aliceblue')  
	 *	 									OR
	 *							  usage getHexValue('255,23,56')  
	 * @return string - Hexadecimal value of the web safe color (if present in the above $webSafeColorDatabase) , false otherwise
	 */
	public function getHexValue($colorInfo) {
	 	
		if(substr_count($colorInfo, ",") == 2) {
			// the input color is in rgb
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue'])))== trim($colorInfo) ) {
					return $this->webSafeColorDatabase[$i]['hexValue'];								
				}
			}	
		}
		else{
			// the input is name of the color
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->webSafeColorDatabase[$i]['colorName']))== strtolower(trim($colorInfo)) ) {
					return $this->webSafeColorDatabase[$i]['hexValue'];								
				}
			}
		}		
		return false;
	}
	
	/**
	 * Function to return the RGB value of the web safe color
	 *
	 * @param $colorInfo string - could be the value of color in hexadecimal or name of the color (no spaces between the name)
	 *							  usage getRgbValue('#ff0000')  
	 *	 									OR
	 *							  usage getRgbValue('255,23,56')  
	 * @return string - RGB value of the web safe color (if present in the above $webSafeColorDatabase) , false otherwise
	 */
	public function getRgbValue($colorInfo) {
	 	
		if(trim($colorInfo[0]) == '#' && strlen(trim($colorInfo))==7) {
			// the input color is in rgb
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->webSafeColorDatabase[$i]['hexValue']))== trim($colorInfo) ) {
					return $this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue']);								
				}
			}	
		}
		else{
			// the input is name of the color
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->webSafeColorDatabase[$i]['colorName']))== strtolower(trim($colorInfo)) ) {
					return $this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue']);								
				}
			}
		}		
		return false;
	}

	
	/**
	 * Function to check if the input color is web safe or not
	 *
	 * @param $colorInfo string - could be the value of color in hexadecimal/RGB or name of the color (no spaces between the name)
	 *							  usage isWebSafeColor('#ff0000')  
	 *	 									OR
	 *							  usage isWebSafeColor('red')  
	 *	 									OR
	 *							  usage isWebSafeColor('255,23,56')  
	 *
	 * @return boolean - true if present in the above $webSafeColorDatabase , false otherwise
	 */
	public function isWebSafeColor($colorInfo) {
		if( trim($colorInfo[0]) == '#' && strlen(trim($colorInfo))==7) {
			//input color is in hexadecimal format	
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->webSafeColorDatabase[$i]['hexValue']))== strtolower(trim($colorInfo)) ) {
					return true;
				}
			}
		}
		elseif(substr_count($colorInfo, ",") == 2) {
			//input color is in rgb format
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->getRgbValuefromHex($this->webSafeColorDatabase[$i]['hexValue'])))== trim($colorInfo) ) {
					return true;
				}
			}
		}
		else {
			//input is the name of the color
			for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
				if( strtolower(trim($this->webSafeColorDatabase[$i]['colorName']))== strtolower(trim($colorInfo)) ) {
					return true;
				}
			}
		}
		return false;
	}
	
	/**
	 * Fucntion to return closet color to main function
	 *
	 * @access private
	 *
	 * @param $colorInfo - string
	 *
	 * @return string
	 */
	private function returnClosestColor($colorInfo) {
		if( strlen(trim($colorInfo)) =='') {
			echo "<b><font face='verdana' color='red' size='2'> ERROR: Invalid color Information. </font></b>";
			return false;
		}

		// no shortest distance found, yet
		$temp_lev = 9999;
		
		// loop through words to find the closest
		for($i=0; $i<count($this->webSafeColorDatabase); $i++) {
			
			$color = $this->webSafeColorDatabase[$i]['colorName'];
			
			// calculate the distance between the input color,
			// and the current color
		   	$lev = levenshtein($colorInfo, $color);
		
		   // check for an exact match
		   if ($lev == 0) {
				   	
		       // closest color is this one (exact match)
		       $closest = $color;
		       $this->isExactMatch = 0;
		
		       // break out of the loop; we've found an exact match
		       break;
		   }
		   else {
		   	
		   	if($lev<=$temp_lev) {
		   		$temp_lev = $lev;
		   		$closest = $color;
		   	}
		   }
		  
		}
		return $closest;		
	}	
	
	/**
	 * Function to return closest websafe color
	 *
	 * @param $colorInfo string- only the name of the color
	 *
	 * @return $string
	 */
	public function getClosestMatchingWebsafeColor($colorInfo) {
		if( (strlen(trim($colorInfo))=='') || ( trim($colorInfo[0]) == '#' && strlen(trim($colorInfo)) == 7) || (substr_count($colorInfo, ",") == 2) ) {
			echo "<b><font face='verdana' color='red' size='2'> ERROR: Invalid color Information. </font></b>";
			return false;
		}
		else {
			// color name
			return $this->returnClosestColor($colorInfo);
		}
		return false;
	}
} 
?>